//【工具函数】/【网络通信】/【请求方法实例】
import WxRequest from './WxRequest'
import {getErrMsgByCode, getErrMsgByMsg} from './errorMessage'

// 创建请求实例
const request = new WxRequest({
  // baseUrl: config.baseUrl,  应对多个接口地址的情况，不设置 baseUrl
  timeout: 5000,
})


// 请求拦截器，处理请求参数
request.interceptors.request = (options) => {
  options.header = {
    ...options.header,
    Authorization: 'Bearer ' + wx.getStorageSync('token'),
  }
  options.useHighPerformanceMode = true  // 开启高性能模式

  return options
}


// 响应拦截器，处理响应数据
request.interceptors.response = (res) => {
  // 响应状态码小于 400，根据返回数据类型处理后返回
  if (res.statusCode < 400) {
    return res.data.data
  }

  // 响应状态码大于等于 400，处理并返回错误信息
  else {
    let errMsg: string
    errMsg = res.data.message || getErrMsgByCode(res.statusCode?.toString()) || '请求失败，请稍后重试'

    errorHandler(errMsg)
    return Promise.reject(errMsg)
  }
}


// 请求失败拦截器，处理错误信息
request.interceptors.fail = (err) => {
  return errorHandler(err.errMsg)
}


// 处理错误信息方法
const errorHandler = (errMsg: string, showToast = true) => {
  console.warn('请求异常：', errMsg)

  // 处理常用错误信息
  errMsg = getErrMsgByMsg(errMsg) || '网络异常，请稍后重试'

  // 在页面显示错误提示
  if (showToast) wx.showToast({
    title: errMsg,
    icon: 'none',
  }).then()

  return errMsg
}


export default request
